<?php
// more about function
// 静态变量
function counter() {
	static $c = 0; # init only once
	return ++$c;
}

for ($i=0; $i < 3; $i++) { 
	echo counter(), "<br/>";
}

// 引用传参
function doubler(&$d) {
	$d <<= 1;
}
$v = 3;
doubler($v);
echo $v, "<br />";

// 默认参数值
function say($name, $some="hello", $thing="world")
{
	echo "$name: \"$some $thing\" <br/>";
}
say("he");
say("he", "fuck");

// 变参函数
function sum($a, $b, $c) {
	echo "$a, $b, $c <br/>";
	return array_sum(func_get_args());
}
echo sum(1, 2, 3, 4, 5, 6, 7), "<br/>";

// 类型提示
class Entertainment {}
class Clown extends Entertainment {}
class Job {}
function handleEntertainment(Entertainment $a)
{
  echo "Handling " . get_class($a) . " fun <br/>";
}
handleEntertainment(new Clown); // works
// handleEntertainment(new Job); // runtime err

// 返回引用
// 要在函数声明时加上引用号
// 且要在函数赋值是加上引用号
function & ref_test() {
	static $a = 0;
	echo "\$a = $a <br/>";
	return $a;
}

$c =& ref_test();
$c++;
ref_test();


// 变量函数, 将函数名存储到字符串中
// 通过该同名字符串调用函数
// 语言结构不能作为函数 echo, isset
function fi() {
	return "fififi";
}
function fee() {
	return "fefefe";
}
function fo() {
	return "fofofo";
}
$name = "fee";
// 先检查这个函数是否存在
if (function_exists($name)) {
	echo $name(), "<br/>";
}

// 闭包(匿名函数) closure
function factory($name) {
	// use(..) 让闭包引用外部变量
	// 防止这个值被回收
	// 于是可以作为函数工厂
	$f = function() use ($name) {
		echo "$name ! <br />";
	}; # 不能漏了这个分号
	return $f;
}
$f1 = factory("ha");
$f2 = factory("ho");
$f3 = factory("he");
$f1();
$f2();
$f3();
// 匿名函数可以作为某些函数的输入参数
$arr = array("aaa", "a", "aaaaa");
usort($arr, function($a, $b) {
	return strlen($a) - strlen($b);});
print_r($arr);



?>